Skip to content

Conversation

@nikhilutexas
Copy link
Contributor

  • docs: add CLAUDE.md for Claude Code context

Generated with Claude Code via Happy

  • chore: pin dependency versions and add dev requirements

Generated with Claude Code via Happy

  • test: add pytest suite with 143 tests at 68% coverage

Tests cover utils (make_slug, generate_ics), base classes (Event, CalendarBase, IntegrationBase), and integrations (investing, imdb, shows, wwe, weather, sportsdb, weather_geocode) with both pure function tests and mocked HTTP integration tests.

Generated with Claude Code via Happy

  • ci: add GitHub Actions test workflow with coverage

Runs pytest with coverage on every push and PRs to main. Uses Python 3.12 (stable) with pip caching.

Generated with Claude Code via Happy

  • test: add tests for 0% coverage integrations (moviedb, releases, thetvdb, twitch, google_sheets, routes)

50 new tests covering all previously untested integration modules. Coverage improved from 68% to 87% (143 → 193 tests).

Generated with Claude Code via Happy

  • test: comprehensive shows.py tests covering scraping, tmsid, episodes, and fetch_events

Shows.py coverage: 21% → 99% (22 new tests).
Total suite: 215 tests, 92% coverage, 0.51s.

Generated with Claude Code via Happy

  • docs: add scraper consolidation design plan

Documents the plan to retire sync2cal-custom-scraper and migrate 7,959 category SOURCE URLs to events-api. Includes URL rewrite rules for all 9 integrations and rollback plan.

Generated with Claude Code via Happy

  • docs: add /tv/genre/ URL pattern to migration design doc

Discovered 11 categories use /tv/genre/{slug} in addition to /tv/platform/{slug}. Updated URL mapping table and rewrite rules.

Generated with Claude Code via Happy

  • feat: auto-refresh TheTVDB bearer token on expiry

Instead of requiring a manually-set bearer token env var, the integration now auto-logins with the API key and caches the token in memory. On 401 responses, it invalidates the cache, re-logins, and retries once.

Generated with Claude Code via Happy

  • refactor: remove THE_TVDB_BEARER_TOKEN env var dependency

Auto-login with API key is sufficient — no need for a separate bearer token env var. Updated tests to mock _login_to_thetvdb instead of setting the env var. Added test for 401 retry flow.

Generated with Claude Code via Happy

  • feat: support Google Sheets service account from env var

Add GOOGLE_SHEETS_SERVICE_ACCOUNT_JSON env var support so credentials can be stored as an environment variable in Railway instead of requiring a file on disk. Falls back to file-based auth if env var is not set.

Generated with Claude Code via Happy

  • fix: use full browser User-Agent for investing.com requests

investing.com rejects requests with truncated User-Agent "Mozilla/5.0", returning 403 Forbidden. Using a complete Chrome UA string fixes this.

Generated with Claude Code via Happy

  • feat: replace investing.com earnings scraping with FMP API

investing.com blocks datacenter IPs with 403 responses, making earnings scraping unreliable from Railway. Replace with Financial Modeling Prep (FMP) API which provides structured JSON earnings calendar data.

  • Earnings now fetched from FMP /stable/earnings-calendar endpoint
  • IPO scraping kept on investing.com (FMP IPO requires paid plan)
  • Added _format_revenue() helper for human-readable revenue display
  • Requires FMP_API_KEY environment variable
  • Updated tests: replaced parse_earnings/build_earnings_payload tests with FMP-specific tests (fetch_earnings_fmp, _format_revenue, etc.)

Generated with Claude Code via Happy

  • feat: add UFC scraper that fetches events directly from UFC.com
  • Scrapes UFC.com events pages for accurate event data
  • Uses data-timestamp attribute for precise event times
  • Extracts fighter names, venues, and fight card info
  • Deduplicates events by URL slug and UID
  • New endpoint: /ufc/events

This replaces TheSportsDB for UFC events which had dates off by ~1 day.

Generated with Claude Code via Happy


* docs: add CLAUDE.md for Claude Code context

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* chore: pin dependency versions and add dev requirements

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* test: add pytest suite with 143 tests at 68% coverage

Tests cover utils (make_slug, generate_ics), base classes (Event,
CalendarBase, IntegrationBase), and integrations (investing, imdb,
shows, wwe, weather, sportsdb, weather_geocode) with both pure
function tests and mocked HTTP integration tests.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* ci: add GitHub Actions test workflow with coverage

Runs pytest with coverage on every push and PRs to main.
Uses Python 3.12 (stable) with pip caching.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* test: add tests for 0% coverage integrations (moviedb, releases, thetvdb, twitch, google_sheets, routes)

50 new tests covering all previously untested integration modules.
Coverage improved from 68% to 87% (143 → 193 tests).

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* test: comprehensive shows.py tests covering scraping, tmsid, episodes, and fetch_events

Shows.py coverage: 21% → 99% (22 new tests).
Total suite: 215 tests, 92% coverage, 0.51s.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* docs: add scraper consolidation design plan

Documents the plan to retire sync2cal-custom-scraper and migrate
7,959 category SOURCE URLs to events-api. Includes URL rewrite
rules for all 9 integrations and rollback plan.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* docs: add /tv/genre/ URL pattern to migration design doc

Discovered 11 categories use /tv/genre/{slug} in addition to
/tv/platform/{slug}. Updated URL mapping table and rewrite rules.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* feat: auto-refresh TheTVDB bearer token on expiry

Instead of requiring a manually-set bearer token env var, the integration
now auto-logins with the API key and caches the token in memory. On 401
responses, it invalidates the cache, re-logins, and retries once.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* refactor: remove THE_TVDB_BEARER_TOKEN env var dependency

Auto-login with API key is sufficient — no need for a separate bearer
token env var. Updated tests to mock _login_to_thetvdb instead of
setting the env var. Added test for 401 retry flow.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* feat: support Google Sheets service account from env var

Add GOOGLE_SHEETS_SERVICE_ACCOUNT_JSON env var support so credentials
can be stored as an environment variable in Railway instead of requiring
a file on disk. Falls back to file-based auth if env var is not set.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* fix: use full browser User-Agent for investing.com requests

investing.com rejects requests with truncated User-Agent "Mozilla/5.0",
returning 403 Forbidden. Using a complete Chrome UA string fixes this.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* feat: replace investing.com earnings scraping with FMP API

investing.com blocks datacenter IPs with 403 responses, making earnings
scraping unreliable from Railway. Replace with Financial Modeling Prep
(FMP) API which provides structured JSON earnings calendar data.

- Earnings now fetched from FMP /stable/earnings-calendar endpoint
- IPO scraping kept on investing.com (FMP IPO requires paid plan)
- Added _format_revenue() helper for human-readable revenue display
- Requires FMP_API_KEY environment variable
- Updated tests: replaced parse_earnings/build_earnings_payload tests
  with FMP-specific tests (fetch_earnings_fmp, _format_revenue, etc.)

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* feat: add UFC scraper that fetches events directly from UFC.com

- Scrapes UFC.com events pages for accurate event data
- Uses data-timestamp attribute for precise event times
- Extracts fighter names, venues, and fight card info
- Deduplicates events by URL slug and UID
- New endpoint: /ufc/events

This replaces TheSportsDB for UFC events which had dates off by ~1 day.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Happy <yesreply@happy.engineering>
@cursor
Copy link

cursor bot commented Feb 6, 2026

You have run out of free Bugbot PR reviews for this billing cycle. This will reset on March 6.

To receive reviews on all of your PRs, visit the Cursor dashboard to activate Pro and start your 14-day free trial.

@nikhilutexas
Copy link
Contributor Author

Closing: UFC scraper was already merged via PR #10. This PR from main branch is stale.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant